package com.zf.yaml_properties_ini;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Properties;

/**
 * .properties 文件读写
 */
public class PropertiesReadWriteTest {
    public static void main(String[] args) throws IOException {
        // 测试读取
        // testRead();
        // 测试写入
        testWrite();

    }

    /**
     * 测试读取
     */
    public static void testRead() throws IOException {
        ClassLoader classLoader = PropertiesReadWriteTest.class.getClassLoader();
        InputStream inputStream = classLoader.getResourceAsStream("prop_test.properties");
        // 指定读取的properties文件的编码格式，防止读取的中文字符乱码
        // 如果不指定编码则使用 Charset.defaultCharset() 方法获取默认编码，
        // Charset.defaultCharset() 方法内部先获取"file.encoding"属性指定的编码，如果获取的编码不正确或者获取不到则使用UTF-8
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
        // 读取数据到 Properties中
        Properties properties = new Properties();
        properties.load(inputStreamReader);
        inputStreamReader.close();

        System.out.println(properties);

        System.out.println(properties.getProperty("say.hello"));
        System.out.println(properties.getProperty("server.database.url"));
    }


    /**
     * 测试写入
     */
    public static void testWrite() throws IOException {
        // 将 Properties 中的输入写入文件中
        Properties properties = new Properties();
        properties.setProperty("say.hello", "哈哈 喽");
        properties.setProperty("server.database.url", "jdbc:mysql://127.0.0.1:6666/dd");

        // 1、使用 Properties.store() 方法写入文件，不填写描述，
        // 缺点：Properties.store() 方法会对“ :、\、=、!”使用 \ 进行转义
        // 而且如果直接使用 字节流 OutputStream 等，那么 Properties.store() 方法会把中文转译成Unicode码后再写入
        FileOutputStream outputStream = new FileOutputStream("D:\\prop_test1.properties");
        properties.store(outputStream, null);
        outputStream.close();

        // 2、所以可以使用 字符流 Writer 等，同时指定编码来防止转成Unicode码，
        // 如果不指定编码则字符流内部会使用 Charset.defaultCharset() 方法获取默认编码，
        // Charset.defaultCharset() 方法内部先获取"file.encoding"属性指定的编码，如果获取的编码不正确或者获取不到则使用UTF-8。
        // 但是 Properties.store() 方法会对“ :、\、=、!”字符使用 \ 进行转义
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("D:\\prop_test2.properties"), StandardCharsets.UTF_8);
        properties.store(outputStreamWriter, null);
        outputStreamWriter.close();

        // 3、手动写入， 指定字符编码，防止写入的中文字符被转产unicode码，也不会对“ :、\、=、!”字符使用 \ 进行转义
        FileWriter outputStreamWriter2 = new FileWriter("D:\\prop_test3.properties", StandardCharsets.UTF_8);
        for (String propertyName : properties.stringPropertyNames()) {
            String propertyValue = properties.getProperty(propertyName);
            outputStreamWriter2.write(propertyName + "=" + propertyValue + "\n");
        }
        outputStreamWriter2.flush();
        outputStreamWriter2.close();

    }

}
